'use strict';

/**
 *
 * JavaScript的默认对象表示方式{}可以视为其他语言中的Map或Dictionary的数据结构，即一组键值对。

 但是JavaScript的对象有个小问题，就是键必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。

 为了解决这个问题，最新的ES6规范引入了新的数据类型Map。要测试你的浏览器是否支持ES6规范，请执行以下代码，如果浏览器报ReferenceError错误，那么你需要换一个支持ES6的浏览器：
 **/
// 测试浏览器是否支持ES6
function testMap() {
    var m = new Map();
    var s = new Set();
    console.log('你的浏览器支持Map和Set！');
}

// 初始化Map需要一个二维数组
function mapstyle1() {
    var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
    // map取值
    console.log(m.get('Michael'));
}

function mapstyle2() {
    var m = new Map(); // 空Map
    m.set('Adam', 67); // 添加新的key-value
    m.set('Bob', 59);
    console.log(m.has('Adam')); // 是否存在key 'Adam': true
    console.log(m.get('Adam')); // 67
    m.delete('Adam'); // 删除key 'Adam'
    console.log(m.get('Adam')); // undefined
}

// 由于一个key只能对应一个value，所以，多次对一个key放入value，后面的值会把前面的值冲掉：
function mapstyle3() {
    var m = new Map();
    m.set('Adam', 67);
    m.set('Adam', 88);
    console.log(m.get('Adam')); // 88
}

// Set和Map类似，也是一组key的集合，但不存储value。由于key不能重复，所以，在Set中，没有重复的key。
function setStyle1() {
    var s1 = new Set(); // 空Set
    console.log(s1);
    var s2 = new Set([1, 2, 3]); // 含1, 2, 3
    console.log(s2);
}

// 重复元素在Set中自动被过滤：
function setStyle2() {
    var s = new Set([1, 2, 3, 3, '3']);
    console.log(s);
}

// 通过add(key)方法可以添加元素到Set中，可以重复添加，但不会有效果：
function setStyle3() {
    var s = new Set();
    s.add(4);
    console.log(s); // Set { 4}
    s.add(4);
    console.log(s); // 仍然是 Set { 4}
}

// 过delete(key)方法可以删除元素：
function setStyle4() {
    var s = new Set([1, 2, 3]);
    console.log(s); // Set {1, 2, 3}
    s.delete(3);
    console.log(s); // Set {1, 2}
}